#!/usr/bin/python
# -*- coding: utf-8 -*-
# @version        : 1.0
# @Creaet Time    : 2021/10/23 9:57 
# @File           : resource.py
# @IDE            : PyCharm
# @desc           : 导入导出数据模型


from import_export import resources
from .models import Customer
from import_export.fields import Field


class CustomerImportResource(resources.ModelResource):
    """
    导入模型
    """

    class Meta:
        model = Customer

        # 排除
        # exclude = ['joined_time', 'update_time']

        # id列导入时必须存在，可以在导入数据中为空，会自增长
        # 导入的时候是根据数据文件的列名来导入的，因此Excel、csv或者json文件里面字段名就要和fields里的或者是Model里的字段名同样，才能够进行导入。
        fields = ('id', 'name', 'nickname', 'telephone', 'qq', "wechat", "grade", 'platform')

        # 如果为 True，此参数将阻止导入检查现有实例的数据库。如果您的导入数据集保证包含新实例，则启用此参数可提高性能。
        # force_init_instance = False

        # 控制将使用哪些对象字段来标识现有实例。
        # import_id_fields = ['id']

        # batch_size 参数控制在单个查询中创建的对象数量。默认是批量创建 1000 个对象。此参数仅在use_bulk为 True 时使用。
        # batch_size = 1000

        # 控制 Queryset.iterator 的 chunk_size 参数，或者，如果使用 prefetch_related ，则控制分页器的 per_page 属性。
        # chunk_size = 无

        # 控制是否应批量执行导入操作。默认情况下，为数据集中的每一行调用对象的save()方法。启用批量后，将使用批量操作保存对象。
        # use_bulk = False


class CustomerExportResource(resources.ModelResource):
    """
    导出模型
    """

    # 自定义导出时的列名
    name = Field(attribute='name', column_name=Customer._meta.get_field("name").verbose_name)
    nickname = Field(attribute='nickname', column_name=Customer._meta.get_field("nickname").verbose_name)
    telephone = Field(attribute='telephone', column_name=Customer._meta.get_field("telephone").verbose_name)
    platform = Field(attribute='platform', column_name=Customer._meta.get_field("platform").verbose_name)
    grade = Field(attribute='grade', column_name=Customer._meta.get_field("grade").verbose_name)
    qq = Field(attribute='qq', column_name=Customer._meta.get_field("qq").verbose_name)
    wechat = Field(attribute='wechat', column_name=Customer._meta.get_field("wechat").verbose_name)
    update_time = Field(attribute='update_time', column_name=Customer._meta.get_field("update_time").verbose_name)
    joined_time = Field(attribute='joined_time', column_name=Customer._meta.get_field("joined_time").verbose_name)

    class Meta:
        model = Customer

        # 需要导出的字段
        fields = ('name', 'nickname', 'telephone', 'platform', "grade", 'qq', 'wechat', 'update_time', 'joined_time')

        # 导出字段顺序
        export_order = ('name', 'nickname', 'telephone', 'qq', 'wechat', 'platform', "grade", 'update_time', 'joined_time')

    # 导出时格式化字段数据内容，格式：dehydrate_字段名
    @staticmethod
    def dehydrate_update_time(instance: Customer):
        return instance.update_time.strftime("%Y-%m-%d %H:%M:%S") if instance.update_time else ''

    @staticmethod
    def dehydrate_joined_time(instance: Customer):
        return instance.joined_time.strftime("%Y-%m-%d %H:%M:%S")

    @staticmethod
    def dehydrate_platform(instance: Customer):
        return instance.get_platform_display()

    @staticmethod
    def dehydrate_grade(instance: Customer):
        return instance.grade + "(" + instance.get_grade_display() + ")"